/**
 * @file image_process.h
 * @brief 图像处理模块接口定义
 * @version 2.1
 * @date 2023-05-20
 */

#ifndef IMAGE_PROCESS_H
#define IMAGE_PROCESS_H

#include <stdint.h>
#include <stdbool.h>

#ifdef __cplusplus
extern "C" {
#endif

// 最大轮廓数量
#define MAX_CONTOURS 100

// 颜色结构体
typedef struct {
    unsigned char b;        // 蓝色分量
    unsigned char g;        // 绿色分量
    unsigned char r;        // 红色分量
    unsigned char a;        // 透明度
} Colour;

// 图像数据结构
typedef struct {
    unsigned char* data;    // 图像数据
    int width;              // 图像宽度
    int height;             // 图像高度
    int channels;           // 图像通道数
} Image;

// 图像轮廓结构体
typedef struct {
    int x;                  // 左上角x坐标
    int y;                  // 左上角y坐标
    int width;              // 宽度
    int height;             // 高度
    float area;             // 面积
} ImageContour;

// 导线检测结果
typedef struct {
    bool detected;                // 是否检测到导线
    float cable_diameter_pixels;  // 导线直径(像素)
    float cable_diameter_mm;      // 导线直径(毫米)
    float ice_thickness_pixels;   // 覆冰厚度(像素)
    float ice_thickness_mm;       // 覆冰厚度(毫米)
} CableDetection;

// 图像处理器配置
typedef struct {
    int threshold_value;    // 二值化阈值
    int blur_size;          // 模糊核大小
    float cable_width_mm;   // 导线直径(毫米)
    float pixels_per_mm;    // 像素/毫米比例
    int min_contour_area;   // 最小轮廓面积
    int max_contour_area;   // 最大轮廓面积
} ImageProcessorConfig;

// 图像处理统计信息
typedef struct {
    uint64_t frames_processed;          // 处理的总帧数
    uint64_t frames_failed;             // 处理失败的帧数
    uint64_t successful_detections;     // 成功检测到目标的次数
    uint64_t last_successful_time;      // 最后一次成功检测的时间戳
    uint64_t last_metrics_time;         // 最后一次记录指标的时间
    float avg_processing_time_ms;       // 平均处理时间(毫秒)
    int health_status;                  // 健康状态评分(0-100)
    int reconnection_attempts;          // 相机重连尝试次数
} ImageProcessingStats;

// ========================= 以下是整合自common_filters.h的内容 =========================

// 滤波器类型枚举
typedef enum {
    FILTER_NONE = 0,          // 无滤波器
    FILTER_GAUSSIAN,          // 高斯滤波
    FILTER_MEDIAN,            // 中值滤波
    FILTER_BILATERAL,         // 双边滤波
    FILTER_BOX                // 方框滤波
} FilterType;

// 滤波器参数结构体
typedef struct {
    FilterType type;          // 滤波器类型
    int kernel_size;          // 内核大小
    float sigma;              // 标准差参数
    bool normalize;           // 是否归一化
} FilterParams;

/**
 * @brief 对图像应用滤波器
 * 
 * @param src_image 输入图像
 * @param dst_image 输出图像
 * @param params 滤波器参数
 * @return int 成功返回0，失败返回-1
 */
int apply_filter(const Image *src_image, Image *dst_image, const FilterParams *params);

/**
 * @brief 获取默认滤波器参数
 * 
 * @param type 滤波器类型
 * @param params 输出参数结构体
 */
void get_default_filter_params(FilterType type, FilterParams *params);

// ========================= 滤波器功能结束 =========================

/**
 * @brief 初始化图像处理模块
 * 
 * @return int 成功返回0，失败返回-1
 */
int init_image_process(void);

/**
 * @brief 清理图像处理模块资源
 */
void cleanup_image_process(void);

/**
 * @brief 初始化图像处理器
 * 
 * @param config 图像处理配置
 * @return int 成功返回0，失败返回-1
 */
int init_image_processor(ImageProcessorConfig *config);

/**
 * @brief 清理图像处理器资源
 */
void cleanup_image_processor(void);

/**
 * @brief 创建图像
 * 
 * @param image 图像结构体指针
 * @param width 图像宽度
 * @param height 图像高度
 * @param channels 图像通道数
 * @return int 成功返回0，失败返回-1
 */
int create_image(Image *image, int width, int height, int channels);

/**
 * @brief 销毁图像，释放资源
 * 
 * @param image 图像结构体指针
 */
void destroy_image(Image *image);

/**
 * @brief 分析图像，测量导线直径和覆冰厚度
 * 
 * @param src_image 输入图像
 * @param result 检测结果
 * @return int 成功返回0，失败返回-1
 */
int analyze_cable_image(const Image *src_image, CableDetection *result);

/**
 * @brief 从文件加载图像
 * 
 * @param filename 图像文件路径
 * @param image 输出的图像结构体指针
 * @return int 成功返回0，失败返回-1
 */
int load_image_from_file(const char *filename, Image *image);

#ifdef HAVE_OPENCV
// 新增：图像保存功能 - 支持JPG和PNG格式
/**
 * @brief 保存图像到文件
 * 
 * @param image_data 图像数据
 * @param width 图像宽度
 * @param height 图像高度
 * @param channels 颜色通道数(1=灰度，3=RGB)
 * @param filename 文件名(包含路径)
 * @param quality 图像质量(0-100，仅对JPEG有效)
 * @return true 保存成功
 * @return false 保存失败
 */
bool opencv_save_image(const unsigned char* image_data, int width, int height, int channels,
                      const char* filename, int quality);

// 新增：双目立体匹配处理 - 用于800W摄像头
bool opencv_stereo_matching(const unsigned char* left_data, const unsigned char* right_data,
                          int width, int height, int channels,
                          float* disparity_data, float* depth_data,
                          float baseline, float focal_length);

// 新增：线缆提取和测量 - 专用于覆冰线缆提取
bool opencv_extract_cable(const unsigned char* image_data, int width, int height, int channels,
                        float* cable_diameter, float* ice_thickness,
                        float known_diameter_mm, float pixels_per_mm);

// 新增：从文件加载图像
bool opencv_load_image(const char* filename, unsigned char** data, int* width, int* height, int* channels);

// 新增：在图像上添加标注信息 - 用于调试模式
/**
 * @brief 在图像上添加文本标注
 * 
 * @param image_data 图像数据
 * @param width 图像宽度
 * @param height 图像高度
 * @param channels 颜色通道数(1=灰度，3=RGB)
 * @param timestamp 时间字符串
 * @param temperature 温度值(℃)
 * @param humidity 湿度值(%)
 * @param wind_speed 风速(m/s)
 * @param wind_direction 风向(°)
 * @param tension1 拉力1(N)
 * @param tension2 拉力2(N)
 * @return true 标注成功
 * @return false 标注失败
 */
bool opencv_annotate_image(unsigned char* image_data, int width, int height, int channels,
                          const char* timestamp,
                          float temperature, float humidity,
                          float wind_speed, float wind_direction,
                          float tension1, float tension2);

/**
 * @brief 在图像上添加自定义文本
 * 
 * @param image_data 图像数据
 * @param width 图像宽度
 * @param height 图像高度
 * @param channels 颜色通道数(1=灰度，3=RGB)
 * @param text 要添加的文本
 * @return true 标注成功
 * @return false 标注失败
 */
bool opencv_add_custom_text(unsigned char* image_data, int width, int height, int channels,
                          const char* text);
#endif

#ifdef __cplusplus
}
#endif

#endif /* IMAGE_PROCESS_H */ 